import { reactive, readonly } from 'vue';

// 响应式状态对象
const state = reactive({
    // user 对象现在会存储从后端收到的所有信息
    user: null,
});

// 从 localStorage 初始化状态, 这是应用启动时保持登录状态的关键
const userFromStorage = localStorage.getItem('user');
if (userFromStorage) {
    try {
        state.user = JSON.parse(userFromStorage);
    } catch (e) {
        console.error("无法从 localStorage 解析用户信息", e);
        localStorage.removeItem('user'); // 如果数据损坏，则清除
    }
}

/**
 * 设置当前用户信息, 并持久化到 localStorage
 * @param {object | null} userData - 从 API 收到的用户数据, 或 null (登出时)
 */
const setUser = (userData) => {
    state.user = userData;
    if (userData) {
        localStorage.setItem('user', JSON.stringify(userData));
    } else {
        localStorage.removeItem('user');
    }
};

/**
 * 登录操作
 * @param {object} userData - 完整的用户登录响应数据
 */
const login = (userData) => {
    setUser(userData);
};

/**
 * 登出操作
 */
const logout = () => {
    setUser(null);
    // 在组件中通过 window.location.href = '/login' 实现跳转, 以确保状态完全重置
};

/**
 * 检查用户是否拥有指定角色
 * @param {string | string[]} roles - 单个角色字符串或角色数组
 * @returns {boolean}
 */
const hasRole = (requiredRoles) => {
    if (!state.user || !state.user.roles || state.user.roles.length === 0) {
        return false;
    }

    const userRoles = new Set(state.user.roles);

    if (Array.isArray(requiredRoles)) {
        // 如果要求多个角色中的任何一个，使用 some
        return requiredRoles.some(role => userRoles.has(role));
    }
    // 如果只要求单个角色
    return userRoles.has(requiredRoles);
};

// 导出 store, 供全局使用
export const useAuthStore = () => {
    return {
        // 使用 readonly 防止外部组件直接修改 state
        state: readonly(state),
        login,
        logout,
        hasRole
    };
};